import axios, { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse, AxiosRequestConfig } from 'axios'
import { iturl,testurl } from '../indexUrl'
import { ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'

const router = useRouter()

interface ApiResponse<T = any> {
  msg: string
  code: number
  data: T
  message?: string
}

const instance: AxiosInstance = axios.create({
  baseURL: iturl,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  },
  withCredentials: false, // 不携带cookie，避免CORS问题
  transformRequest: [(data) => JSON.stringify(data)], // 请求数据转换为 JSON 字符串
  validateStatus: (status) => status >= 200 && status < 300, // 只接受 2xx 的状态码
})

// 请求拦截器自动携带 Token
instance.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const token = localStorage.getItem('token')
    if (token) {
      // 确保headers对象存在
      config.headers = config.headers || {}
      // 设置Authorization头
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config
  },
  (error) => {
    // 处理请求错误
    return Promise.reject(error)
  }
)

// 响应拦截器：处理响应数据和错误
instance.interceptors.response.use(
  (response: AxiosResponse<ApiResponse>) => {
    const res = response.data
    // 处理 310 状态码，表示 JWT 过期
    if (res.code === 310) {
      ElMessage({
        message: 'Token已过期，请重新登录',
        type: 'warning'
      })
      // 清除本地存储的 token
      localStorage.removeItem('Token')
      // 跳转到登录页
      router.push('/login')
      return Promise.reject(new Error('Token 过期'))
    }
    
    if (response.status !== 200) {
      console.error('响应错误:', res.message)
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return response
    }
  },
  (error) => {
    if (error.response) {
      if (error.response.status === 401) {
        console.error('未授权，请重新登录')
      }
    } else if (error.request) {
      console.error('请求未响应:', error.request)
    } else {
      console.error('请求错误:', error.message)
    }
    return Promise.reject(error)
  }
)

async function request<T = any>(config: AxiosRequestConfig): Promise<T> {
  // 对 POST | PUT 请求特殊处理
  if (config.method?.toUpperCase() === 'POST' || config.method?.toUpperCase() === 'PUT') {
    // 如果已经有 data，则保留原有的 data
    if (config.params && !config.data) {
      config.data = config.params
      config.params = undefined // 使用 undefined 而不是空对象
    }
  }

  try {
    const res = await instance.request<T>({ ...config })
    return res.data
  } catch (e) {
    if (axios.isAxiosError(e)) {
      // 可以在这里处理 Axios 错误
    }
    return Promise.reject(e)
  }
}

// 封装常用的请求方法
const api = {
  get<T = any>(url: string, params?: any): Promise<ApiResponse<T>> {
    return request({ url, method: 'GET', params })
  },
  post<T = any>(url: string, data?: any): Promise<ApiResponse<T>> {
    return request({ url, method: 'POST', data })
  },
  put<T = any>(url: string, data?: any): Promise<ApiResponse<T>> {
    return request({ url, method: 'PUT', data })
  },
  delete<T = any>(url: string, params?: any): Promise<ApiResponse<T>> {
    return request({ url, method: 'DELETE', params })
  }
}

// 导出配置好的 Axios 实例
export default api
